#pragma once

#include "NodoSimple.h"
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

template <class T>
class Cola
{
private:
    
    NodoSimple<T>* front;  //puntero al inicio
	NodoSimple<T>* back;
	int cantidad;
public: 
	Cola();
    ~Cola();
    bool empty();
	T* dequeue();
    void enqueue(T*);
	int getCantidad();
};


template<class T>
bool Cola<T>::empty(){
   return front == back;
}

template<class T>
T* Cola<T>::dequeue(){
    if(!empty())
    {
        NodoSimple<T>* aux = front;
        front = front->getSigNodo(); 
        aux->setSigNodo(NULL);
        cantidad--;
        return aux->getInfo();
    }
   return NULL;
}

template<class T>
 void Cola<T>::enqueue(T* e){
    if(!empty())
    {
        NodoSimple<T>* aux = front;
        NodoSimple<T>* ult = front;
        while(aux != back)
        {
            ult = aux;
            aux = aux->getSigNodo();
        }
        aux = new NodoSimple<T>(e, back);
        ult->setSigNodo(aux);
    }
    else
    {
        NodoSimple<T>* front = new NodoSimple<T>(e, back);
    }
	cantidad++;
}


template<class T>
Cola<T>::Cola()
{
	front = back = NULL; 
	cantidad = 0;
}


template<class T>
Cola<T>::~Cola()
{
	while(front!=NULL)
	{
		delete dequeue();
	}

}


template<class T>
int Cola<T>::getCantidad()
{
	return cantidad;
}




